﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using Entidades;

namespace DAO
{
    public static class PeliculaDAO
    {
        public static DataTable cargarGrilla(string orden)
        {
            SqlConnection cn=new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd=new SqlCommand();
            cmd.Connection=cn;
            DataTable dt = new DataTable();
            try
            {
                cn.Open();
                cmd.CommandText = "select p.id_Pelicula,p.nombre,g.nombre,p.clasificacion,p.director,p.interpretes,p.sinopsis,p.paisOrigen,Year(p.añoEstreno) as añoEstreno ,p.duracion from Pelicula p, Genero g where p.id_Genero=g.id_Genero";
                if (orden == "")
                    cmd.CommandText += " order by p.nombre";
                else
                {
                    if (orden.Equals("nombre1"))
                    {
                        cmd.CommandText += " order by g.nombre";
                    }
                    else
                    {
                        if (orden.Equals("nombre"))
                        {
                            cmd.CommandText += " order by p.nombre";
                        }
                        else
                            cmd.CommandText += " order by " + orden; 
                    }
                    
                }
                SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al cargar la grilla:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
                return dt;
           
        }
        public static Pelicula buscarPorId(int id)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            Pelicula p = new Pelicula();
            try
            {
                cn.Open();
                cmd.CommandText = "select id_Pelicula,nombre,id_Genero,clasificacion,director,interpretes,sinopsis,paisOrigen,añoEstreno, duracion from Pelicula where id_Pelicula=@Id";
                cmd.Parameters.AddWithValue("@Id", id);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    p.Id_Pelicula = int.Parse(dr["id_Pelicula"].ToString());
                    p.Nombre = dr["nombre"].ToString();
                    p.Genero = int.Parse(dr["id_Genero"].ToString());
                    p.Clasificacion = dr["clasificacion"].ToString();
                    p.Director = dr["director"].ToString();
                    p.Interpretes = dr["interpretes"].ToString();
                    p.Sipnosis = dr["sinopsis"].ToString();
                    p.PaisOrigen = dr["paisOrigen"].ToString();
                    p.AñoEstreno = DateTime.Parse(dr["añoEstreno"].ToString());
                    p.Duracion = DateTime.Parse(dr["duracion"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al buscar la pelicula:" + ex.Message);

            }
            finally
            {
                cn.Close(); 
            }           
            return p;
 
        }
        public static DataTable cargarComboGenero()
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            DataTable dt = new DataTable();
            try
            {
                cn.Open();
                cmd.CommandText = "select id_Genero,nombre from Genero ";
                SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al cargar el combo de genero:" +ex.Message);
            }
            finally
            {
                cn.Close();
            }
            return dt;
 
        }
        public static void insert(Pelicula p)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            try
            {
                cn.Open();
                cmd.CommandText = "insert into Pelicula(nombre,id_Genero,clasificacion,director,interpretes,sinopsis,paisOrigen,añoEstreno,duracion) values (@nom,@id_G,@cla,@dir,@int,@sin,@pai,@año,@dur)";
                cmd.Parameters.AddWithValue("@nom", p.Nombre);
                cmd.Parameters.AddWithValue("@id_G", p.Genero);
                cmd.Parameters.AddWithValue("@cla", p.Clasificacion);
                cmd.Parameters.AddWithValue("@dir", p.Director);
                cmd.Parameters.AddWithValue("@int", p.Interpretes);
                cmd.Parameters.AddWithValue("@sin", p.Sipnosis);
                cmd.Parameters.AddWithValue("@pai", p.PaisOrigen);
                cmd.Parameters.AddWithValue("@año", p.AñoEstreno);
                cmd.Parameters.AddWithValue("@dur", p.Duracion);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al insertar la pelicula:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }           
 
        }
        public static void update(Pelicula p)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            try
            {
                cn.Open();
                cmd.CommandText = "update Pelicula set nombre=@nom,id_Genero=@id_G,clasificacion=@cla,director=@dir,interpretes=@int,sinopsis=@sin,paisOrigen=@pai,añoEstreno=@año,duracion=@dur where Id_Pelicula=@Id";
                cmd.Parameters.AddWithValue("@Id", p.Id_Pelicula);
                cmd.Parameters.AddWithValue("@nom", p.Nombre);
                cmd.Parameters.AddWithValue("@id_G", p.Genero);
                cmd.Parameters.AddWithValue("@cla", p.Clasificacion);
                cmd.Parameters.AddWithValue("@dir", p.Director);
                cmd.Parameters.AddWithValue("@int", p.Interpretes);
                cmd.Parameters.AddWithValue("@sin", p.Sipnosis);
                cmd.Parameters.AddWithValue("@pai", p.PaisOrigen);
                cmd.Parameters.AddWithValue("@año", p.AñoEstreno);
                cmd.Parameters.AddWithValue("@dur", p.Duracion);
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al actualizar la pelicula:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
        }
        public static void darBajaPelicula(int idPelicula)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            try
            {
                cn.Open();
                cmd.Connection = cn;
                cmd.CommandText = "delete from Pelicula where id_Pelicula=@id";
                cmd.Parameters.Add(new SqlParameter("@id", idPelicula));
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Erroar al eliminar la pelicula:" + ex.Message);

            }
            finally
            {
                cn.Close();
 
            }
        }
        public static DataTable cargarGrillaByFiltro(string nombre, int? genero,int? añoEstreno,string orden)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            DataTable dt = new DataTable();
            try
            {
                cn.Open();
                string sql = "select p.id_Pelicula,p.nombre,g.nombre,p.clasificacion,p.director,p.interpretes,p.sinopsis,p.paisOrigen,Year(p.añoEstreno) as añoEstreno ,p.duracion from Pelicula p, Genero g where p.id_Genero=g.id_Genero ";

                if (!string.IsNullOrEmpty(nombre))
                {
                    sql += " and p.nombre like @Nom";
                    cmd.Parameters.AddWithValue("@Nom", nombre + "%");
                }
                if (genero != null)
                {
                    sql += " and p.id_Genero=@Genero";
                    cmd.Parameters.AddWithValue("@Genero", genero);
                }
                if (añoEstreno != null)
                {
                    sql += " and Year(p.añoEstreno)=@AñoEstreno";
                    cmd.Parameters.AddWithValue("@AñoEstreno", añoEstreno);
                }
                cmd.CommandText = sql;
                if (orden == "")
                    cmd.CommandText += " order by p.nombre";
                else
                {
                    if (orden.Equals("nombre1"))
                    {
                        cmd.CommandText += " order by g.nombre";
                    }
                    else
                    {
                        if (orden.Equals("nombre"))
                        {
                            cmd.CommandText += " order by p.nombre";
                        }
                        else
                            cmd.CommandText += " order by " + orden;
                    }

                }
                SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al cargar grilla por filtros:" + ex.Message);
            }
            finally
            {
                cn.Close(); 
            }
            return dt;
        }
        public static DataTable cargarCombo()
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            DataTable dt = new DataTable();
            try
            {
                cn.Open();
                cmd.CommandText = "select id_Pelicula,nombre from Pelicula";
                SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al cargar el combo Pelicula:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
            return dt;

        }
        public static string buscarNombreGenero(int id)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            string g = "";
            try
            {
                cn.Open();
                cmd.CommandText = "select nombre from Genero where id_Genero=@Id";
                cmd.Parameters.AddWithValue("@Id", id);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    g = dr["nombre"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al buscar Genero:" + ex.Message);

            }
            finally
            {
                cn.Close();
            }
            return g;

        }
        public static string obtenerNombrePelicula(int id)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            string nombre = "";
            try
            {
                cn.Open();
                cmd.CommandText = "select nombre from Pelicula where id_Pelicula=@Id";
                cmd.Parameters.AddWithValue("@Id",id);
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    nombre = dr["nombre"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al buscar nombre de  Pelicula:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
            return nombre;
 
        }

        public static DataTable cargarComboCine()
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            DataTable dt = new DataTable();
            try
            {
                cn.Open();
                cmd.CommandText = "select id_Cine,nombre from Cine";
                SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al cargar el combo Cine:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
            return dt;

        }
        public static DataTable cargarComboCineSala(int idCine)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            DataTable dt = new DataTable();
            try
            {
                cn.Open();
                cmd.CommandText = "select s.numero_Sala, s.nombre from Sala s, CinePorSala cp where cp.id_Cine=@Id and cp.numero_Sala=s.numero_Sala";
                cmd.Parameters.AddWithValue("@Id", idCine);
                SqlDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al cargar el combo Sala:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
            return dt;

        }
        public static string obtenerCapacidad(int idCine, int idSala)
        {
            SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexionBaseDatos"].ConnectionString);
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cn;
            string dt = "";
            try
            {
                cn.Open();
                cmd.CommandText = "select capacidad from CinePorSala  where id_Cine=@Id and numero_Sala=@IdSala";
                cmd.Parameters.AddWithValue("@Id", idCine);
                cmd.Parameters.AddWithValue("@IdSala", idSala);
                SqlDataReader dr = cmd.ExecuteReader();
                if(dr.Read())
                {
                    dt=dr["capacidad"].ToString();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Error al obtener la capacidad:" + ex.Message);
            }
            finally
            {
                cn.Close();
            }
            return dt;
 
        }
    }
}
